home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / networke / cow / cowl-1.000 / cowl-1 / entrywin.c < prev    next >
C/C++ Source or Header  |  1994-04-16  |  19KB  |  813 lines

  1. /*
  2.  * entrywin.c
  3.  * 
  4.  * The original newwin.c split into two sections this one handling all the motd
  5.  * and entry window stuff
  6.  * 
  7.  */
  8. #include "copyright.h"
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <math.h>
  14. #include <signal.h>
  15. #include <sys/types.h>
  16. #ifdef hpux
  17. #include <time.h>
  18. #else                /* hpux */
  19. #include <sys/time.h>
  20. #endif                /* hpux */
  21. #include "Wlib.h"
  22. #include "defs.h"
  23. #include "struct.h"
  24. #include "data.h"
  25. #include "packets.h"
  26.  
  27. #include "bitmaps/clockbitmap.h"
  28.  
  29. static int      line = 0;
  30. int             MaxMotdLine = 0;
  31.  
  32. #ifdef EM
  33. /*
  34.  * if a motd line from the server is this, the client will junk all motd *
  35.  * data it currently has.  New data may be received
  36.  */
  37. #define MOTDCLEARLINE  "\033\030CLEAR_MOTD\000"
  38. #endif
  39.  
  40. #define SIZEOF(a)    (sizeof (a) / sizeof (*(a)))
  41.  
  42. #define BOXSIDE        (WINSIDE / 5)
  43. #define TILESIDE    16
  44. #define MESSAGESIZE    20
  45. #define STATSIZE    (MESSAGESIZE * 2 + BORDER)
  46. #define YOFF        0
  47.  
  48. #define stipple_width 16
  49. #define stipple_height 16
  50. static char     stipple_bits[] =
  51. {
  52.    0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08,
  53.    0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80,
  54.    0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08,
  55.    0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80};
  56.  
  57. /* This routine throws up an entry window for the player. */
  58.  
  59. entrywindow(team, s_type)
  60.     int            *team, *s_type;
  61. {
  62.    int             typeok = 0, i = 0;
  63.    long            startTime;
  64.    W_Event         event;
  65.    int             lastplayercount[4];
  66.    int             okayMask, lastOkayMask;
  67.    int             resetting = 0;
  68.    int             tiled = 0;
  69.    long            lasttime = -1;
  70.    int             spareTime = 240;    /* Allow them an extra 240 seconds,
  71.                      * as long as they are active */
  72.    int             elapsed;
  73.    struct timeval  tv;
  74.    fd_set          mask;
  75.  
  76.    /* The following allows quick choosing of teams */
  77.  
  78.    if(fastQuit){
  79.       *team = -1;
  80.       return;
  81.    }
  82.  
  83.    lastOkayMask = okayMask = tournMask;
  84.  
  85.    for (i = 0; i < 4; i++) {
  86.       if (okayMask & (1 << i)) {
  87.      tiled = 0;
  88.       } else {
  89.      tiled = 1;
  90.       }
  91.  
  92.       if (tiled) {
  93.      W_TileWindow(teamWin[i], stipple);
  94.       } else {
  95.      W_UnTileWindow(teamWin[i]);
  96.       }
  97.       W_MapWindow(teamWin[i]);
  98.       lastplayercount[i] = -1;    /* force redraw first time through */
  99.    }
  100.    W_MapWindow(qwin);
  101.  
  102.    *team = -1;
  103.    startTime = time(0);
  104.    if (me->p_whydead != KWINNER && me->p_whydead != KGENOCIDE)
  105.       showMotd(w, line);
  106.  
  107.    if (W_IsMapped(playerw))
  108.       playerlist();
  109.  
  110.    do {
  111.       while (!W_EventsPending()) {
  112.  
  113. #ifdef PING
  114.      /*
  115.       * changes here so that client reads from server whenever available
  116.       * instead of waiting 1 second each time.  This has no affect on
  117.       * anything since we time(0) autoquit anyway
  118.       */
  119. #endif
  120.      me->p_ghostbuster = 0;
  121.      tv.tv_sec = 1;
  122.      tv.tv_usec = 0;
  123.  
  124.      FD_ZERO(&mask);
  125.      FD_SET(W_Socket(), &mask);
  126.      FD_SET(sock, &mask);
  127.      if (udpSock >= 0)
  128.         FD_SET(udpSock, &mask);
  129.      select(32, &mask, 0, 0, &tv);
  130.  
  131.      if (FD_ISSET(sock, &mask) ||
  132.          (udpSock >= 0 && FD_ISSET(udpSock, &mask))){
  133.         readFromServer(&mask);
  134.      }
  135.  
  136.      elapsed = time(0) - startTime;
  137.      if (elapsed > AUTOQUIT) {
  138.         printf("Auto-Quit.\n");
  139.         *team = 4;
  140.         break;
  141.      }
  142.      if (lasttime != time(0)) {
  143.         if (W_IsMapped(playerw))
  144.            playerlist2();
  145.  
  146.         showTimeLeft(elapsed, AUTOQUIT);
  147.         lasttime = time(0);
  148.      }
  149.      okayMask = tournMask;
  150.  
  151.      for (i = 0; i < 4; i++) {
  152.         if ((okayMask ^ lastOkayMask) & (1 << i)) {
  153.            if (okayMask & (1 << i)) {
  154.           W_UnTileWindow(teamWin[i]);
  155.            } else {
  156.           W_TileWindow(teamWin[i], stipple);
  157.            }
  158.            lastplayercount[i] = -1;    /* force update */
  159.         }
  160.         redrawTeam(teamWin[i], i, &lastplayercount[i]);
  161.      }
  162.      lastOkayMask = okayMask;
  163.       }
  164.       if (*team == 4)
  165.      break;
  166.  
  167.       if (time(0) - startTime <= spareTime) {
  168.      spareTime -= time(0) - startTime;
  169.      startTime = time(0);
  170.       } else {
  171.      startTime += spareTime;
  172.      spareTime = 0;
  173.       }
  174.       if (!W_EventsPending())
  175.      continue;
  176.       W_NextEvent(&event);
  177.       typeok = 1;
  178.       switch ((int) event.type) {
  179.       case W_EV_KEY:
  180.      switch (event.key) {
  181.      case 's':
  182.         *s_type = SCOUT;
  183.         break;
  184.      case 'd':
  185.         *s_type = DESTROYER;
  186.         break;
  187.      case 'c':
  188.         *s_type = CRUISER;
  189.         break;
  190.      case 'b':
  191.         *s_type = BATTLESHIP;
  192.         break;
  193. #ifdef GALAXY
  194.      case 'g':
  195.         *s_type = SGALAXY;
  196.         break;
  197. #endif                /* GALAXY */
  198.      case 'X':
  199.         *s_type = ATT;
  200.         break;
  201.      case 'a':
  202.         *s_type = ASSAULT;
  203.         break;
  204.      case 'o':
  205.         *s_type = STARBASE;
  206.         break;
  207.      default:
  208.         typeok = 0;
  209.         break;
  210.      }
  211.      if (event.Window == w) {
  212.         switch (event.key) {
  213.         case 'y':
  214.            if (resetting) {
  215.           sendResetStatsReq('Y');
  216.           warning("OK, your stats have been reset.");
  217.           resetting = 0;
  218.            }
  219.            break;
  220.         case 'n':
  221.            if (resetting) {
  222.           warning("I didn't think so.");
  223.           resetting = 0;
  224.            }
  225.            break;
  226.         case 'R':
  227.            warning("Are you sure you want to reset your stats?");
  228.            resetting = 1;
  229.            break;
  230.         case 'f':        /* Scroll motd forward */
  231.            line = line + 28;
  232.            if (line > MaxMotdLine) {
  233.           line = line - 28;
  234.           break;
  235.            }
  236.            W_ClearWindow(w);
  237.            showMotd(w, line);
  238.            break;
  239.         case 'b':        /* Scroll motd backward */
  240.            if (line == 0)
  241.           break;
  242.            line = line - 28;
  243.            if (line < 0)
  244.           line = 0;
  245.            W_ClearWindow(w);
  246.            showMotd(w, line);
  247.            break;
  248. #ifdef EM
  249.         case 'S':
  250.            SaveMotd();
  251.            break;
  252. #endif
  253.         }
  254.      }
  255.      /* No break, we just fall through */
  256.       case W_EV_BUTTON:
  257.      if (typeok == 0)
  258.         break;
  259.      for (i = 0; i < 4; i++)
  260.         if (event.Window == teamWin[i]) {
  261.            *team = i;
  262.            break;
  263.         }
  264.      if (event.Window == qwin /* new */ &&
  265.          event.type == W_EV_BUTTON) {
  266.         *team = 4;
  267.         break;
  268.      }
  269.      if (*team != -1 && !teamRequest(*team, *s_type)) {
  270.         *team = -1;
  271.      }
  272.      break;
  273.       case W_EV_EXPOSE:
  274.      for (i = 0; i < 4; i++)
  275.         if (event.Window == teamWin[i]) {
  276.            lastplayercount[i] = -1;    /* force update */
  277.            redrawTeam(teamWin[i], i, &lastplayercount[i]);
  278.            break;
  279.         }
  280.      if (event.Window == qwin)
  281.         redrawQuit();
  282.      else if (event.Window == tstatw)
  283.         redrawTstats();
  284.      else if (event.Window == iconWin)
  285.         drawIcon();
  286.      else if (event.Window == w)
  287.         showMotd(w, line);
  288.      else if (event.Window == helpWin)
  289.         fillhelp();
  290. #ifdef XTREKRC_HELP
  291.      else if (defWin && (event.Window == defWin))
  292.         showdef();
  293. #endif
  294.      else if (event.Window == playerw)
  295.         playerlist();
  296.      else if (event.Window == warnw)
  297.         W_ClearWindow(warnw);
  298.      else if (event.Window == messagew)
  299.         W_ClearWindow(messagew);
  300.      break;
  301.       }
  302.    } while (*team < 0);
  303.    if (event.Window != qwin)
  304.       warning("Welcome aboard Captain!");
  305.  
  306.    if (*team == 4) {
  307.       *team = -1;
  308.       return;
  309.    }
  310.    for (i = 0; i < 4; i++)
  311.       W_UnmapWindow(teamWin[i]);
  312.    W_UnmapWindow(qwin);
  313. }
  314.  
  315. /* Attempt to pick specified team & ship */
  316. teamRequest(team, ship)
  317.     int             team, ship;
  318. {
  319.    int             lastTime;
  320.  
  321.    pickOk = -1;
  322.    sendTeamReq(team, ship);
  323.    lastTime = time(NULL);
  324.    while (pickOk == -1) {
  325.       if (lastTime + 3 < time(NULL)) {
  326.      sendTeamReq(team, ship);
  327.       }
  328.       socketPause();
  329.       readFromServer(NULL);
  330.       if (isServerDead()) {
  331.      printf("Whoops!  We've been ghostbusted!\n");
  332.      printf("Pray for a miracle!\n");
  333.      /* UDP fail-safe */
  334.      commMode = commModeReq = COMM_TCP;
  335.      commSwitchTimeout = 0;
  336.      if (udpSock >= 0)
  337.         closeUdpConn();
  338.      if (udpWin) {
  339.         udprefresh(UDP_CURRENT);
  340.         udprefresh(UDP_STATUS);
  341.      }
  342.      connectToServer(nextSocket);
  343.      printf("Yea!  We've been resurrected!\n");
  344.      pickOk = 0;
  345.      break;
  346.       }
  347.    }
  348.    return (pickOk);
  349. }
  350.  
  351. numShips(owner)
  352. {
  353.    int             i, num = 0;
  354.    struct player  *p;
  355.  
  356.    for (i = 0, p = players; i < MAXPLAYER; i++, p++)
  357.       if (p->p_status == PALIVE && p->p_team == owner)
  358.      num++;
  359.    return (num);
  360. }
  361.  
  362. realNumShips(owner)
  363. {
  364.    int             i, num = 0;
  365.    struct player  *p;
  366.  
  367.    for (i = 0, p = players; i < MAXPLAYER; i++, p++)
  368.       if (p->p_status != PFREE &&
  369.       p->p_team == owner)
  370.      num++;
  371.    return (num);
  372. }
  373.  
  374. deadTeam(owner)
  375.     int             owner;
  376.     /* The team is dead if it has no planets and cannot coup it's home planet */
  377. {
  378.    int             i, num = 0;
  379.    struct planet  *p;
  380.  
  381.    if (planets[remap[owner] * 10 - 10].pl_couptime == 0)
  382.       return (0);
  383.    for (i = 0, p = planets; i < MAXPLANETS; i++, p++) {
  384.       if (p->pl_owner & owner) {
  385.      num++;
  386.       }
  387.    }
  388.    if (num != 0)
  389.       return (0);
  390.    return (1);
  391. }
  392.  
  393. static char    *AUTHOR[] =
  394. {
  395.    "",
  396.    "---  XtrekII Release Version 6.1 ---",
  397.    "By Chris Guthrie, Ed James,",
  398.    "Scott Silvey, and Kevin Smith",
  399.    "Amdahl UDP Revision",    /* UDP */
  400. };
  401.  
  402. checkBold(line)
  403.     /* Determine if that line should be highlighted on sign-on screen */
  404.     /* Which is done when it is the players own score being displayed */
  405.     char           *line;
  406. {
  407.    char           *s, *t;
  408.    int             i;
  409.    int             end = 0;
  410.  
  411.    if (strlen(line) < 60)
  412.       return (0);
  413.    if (me == NULL)
  414.       return (0);
  415.  
  416.    s = line + 4;
  417.    t = me->p_name;
  418.  
  419.  
  420.    for (i = 0; i < 16; i++) {
  421.       if (!end) {
  422.      if (*t == '\0')
  423.         end = 1;
  424.      else if (*t != *s)
  425.         return (0);
  426.       }
  427.       if (end) {
  428.      if (*s != ' ')
  429.         return (0);
  430.       }
  431.       s++;
  432.       t++;
  433.    }
  434.    return (1);
  435. }
  436.  
  437. struct list {
  438.    char            bold;
  439.    struct list    *next;
  440.    char           *data;
  441. };
  442.  
  443. static struct list *motddata = NULL;    /* pointer to first bit of motddata */
  444. static int      first = 1;
  445.  
  446. #if __STDC__ || defined(__cplusplus)
  447. #define P_(s) s
  448. #else
  449. #define P_(s) ()
  450. #endif
  451.  
  452. /* entrywin.c */
  453. static showValues P_((struct list *data));
  454.  
  455. #undef P_
  456.  
  457. showMotd(motdwin, atline)
  458.     W_Window        motdwin;
  459.     int             atline;
  460. {
  461.    FILE           *fopen();
  462.    int             i, length, top, center;
  463.    struct list    *data;
  464.    int             count;
  465.  
  466.    W_ClearWindow(motdwin);
  467.    for (i = 0; i < SIZEOF(AUTHOR); i++) {
  468.       length = strlen(AUTHOR[i]);
  469.       center = WINSIDE / 2 - (length * W_Textwidth) / 2;
  470.       W_WriteText(motdwin, center, i * W_Textheight, textColor, AUTHOR[i],
  471.           length, W_RegularFont);
  472.    }
  473.    top = SIZEOF(AUTHOR) + 5;
  474.  
  475.    if (first) {
  476.       first = 0;
  477.       data = motddata;
  478.       while (data != NULL) {
  479.      data->bold = checkBold(data->data);
  480.      data = data->next;
  481.       }
  482.    }
  483.    data = motddata;
  484.    for (i = 0; i < atline; i++) {
  485.       if (data == NULL) {
  486.      atline = 0;
  487.      data = motddata;
  488.      break;
  489.       }
  490.       data = data->next;
  491.    }
  492.    count = 28;            /* Magical # of lines to display */
  493.    for (i = top; i < 50; i++) {
  494.       if (data == NULL)
  495.      break;
  496.       if (!strcmp(data->data, "\t@@@"))    /* ATM */
  497.      break;
  498.       if (data->bold) {
  499.      W_WriteText(motdwin, 20, i * W_Textheight, textColor, data->data,
  500.              strlen(data->data), W_BoldFont);
  501.       } else {
  502.      W_WriteText(motdwin, 20, i * W_Textheight, textColor, data->data,
  503.              strlen(data->data), W_RegularFont);
  504.       }
  505.       data = data->next;
  506.       count--;
  507.       if (count <= 0)
  508.      break;
  509.    }
  510.  
  511.    showValues(data);
  512. }
  513.  
  514. /*
  515.  * ATM: show the current values of the .sysdef parameters.
  516.  */
  517. static
  518. showValues(data)
  519.     struct list    *data;
  520. {
  521.    int             i;
  522.    static char    *msg = "OPTIONS SET WHEN YOU STARTED WERE:";
  523.  
  524.    /* try to find the start of the info */
  525.    while (1) {
  526.       if (data == NULL)
  527.      return;
  528.       if (!strcmp(data->data, STATUS_TOKEN))
  529.      break;
  530.       data = data->next;
  531.    }
  532.    data = data->next;
  533.  
  534.    W_WriteText(mapw, 20, 14 * W_Textheight, textColor, msg,
  535.            strlen(msg), W_RegularFont);
  536.    for (i = 16; i < 50; i += 2) {
  537.       if (data == NULL)
  538.      break;
  539.       if (data->data[0] == '+')    /* quick boldface hack */
  540.      W_WriteText(mapw, 20, i * W_Textheight, textColor, data->data + 1,
  541.              strlen(data->data) - 1, W_BoldFont);
  542.       else
  543.      W_WriteText(mapw, 20, i * W_Textheight, textColor, data->data,
  544.              strlen(data->data), W_RegularFont);
  545.       data = data->next;
  546.    }
  547. }
  548.  
  549. newMotdLine(line)
  550.     char           *line;
  551. {
  552.    static struct list **temp = &motddata;
  553.    static int      statmode = 0;/* ATM */
  554.  
  555.    if (!statmode && !strcmp(line, STATUS_TOKEN))
  556.       statmode = 1;
  557.    if (!statmode)
  558.       MaxMotdLine++;        /* ATM - don't show on left */
  559.    (*temp) = (struct list *) malloc(sizeof(struct list));
  560.    if ((*temp) == NULL) {    /* malloc error checking -- 10/30/92 EM */
  561.       printf("Warning:  Couldn't malloc space for a new motd line!");
  562.       return;
  563.    }
  564. #ifdef EM
  565.    /* Motd clearing code */
  566.    if (strcmp(line, MOTDCLEARLINE) == 0) {
  567.       ClearMotd();
  568.       return;
  569.    }
  570. #endif
  571.  
  572.    (*temp)->next = NULL;
  573.    (*temp)->data = malloc(strlen(line) + 1);
  574.    strcpy((*temp)->data, line);
  575.    temp = &((*temp)->next);
  576. }
  577. #ifdef EM
  578. /* Free the current motdData */
  579. ClearMotd()
  580. {
  581.    struct list    *temp, *temp2;
  582.  
  583.    temp = motddata;        /* start of motd information */
  584.    while (temp != NULL) {
  585.       temp2 = temp;
  586.       temp = temp->next;
  587.       free(temp2->data);
  588.       free(temp2);
  589.    }
  590.  
  591.    first = 1;            /* so that it'll check bold next time around */
  592. }
  593. #endif
  594.  
  595. /* ARGSUSED */
  596. getResources(prog)
  597.     char           *prog;
  598. {
  599.    getColorDefs();
  600.    getTiles();
  601. }
  602.  
  603. getTiles()
  604. {
  605.    stipple = W_StoreBitmap(stipple_width, stipple_height, stipple_bits, w);
  606. }
  607.  
  608. redrawTeam(win, teamNo, lastnum)
  609.     W_Window        win;
  610.     int            *lastnum;
  611. {
  612.    char            buf[BUFSIZ];
  613.    static char    *teams[] =
  614.    {"Federation", "Romulan", "Klingon", "Orion"};
  615.    int             num = numShips(1 << teamNo);
  616.  
  617.    /* Only redraw if number of players has changed */
  618.    if (*lastnum == num)
  619.       return;
  620.  
  621.    W_ClearWindow(win);
  622.    W_WriteText(win, 5, 5, shipCol[teamNo + 1], teams[teamNo],
  623.            strlen(teams[teamNo]), W_RegularFont);
  624.    (void) sprintf(buf, "%d", num);
  625.    W_MaskText(win, 35, 46, shipCol[teamNo + 1], buf, strlen(buf),
  626.           W_BigFont);
  627.    *lastnum = num;
  628. }
  629.  
  630. redrawQuit()
  631. {
  632.    W_WriteText(qwin, 5, 5, textColor, "Quit xtrek", 10, W_RegularFont);
  633. }
  634.  
  635. #ifndef EM
  636. char           *help_message[] =
  637. {
  638.    "0-9   Set speed",
  639.    ")     speed = 10",
  640.    "!     speed = 11",
  641.    "@     speed = 12",
  642.    "k     Set course",
  643.    "p     Fire phaser",
  644.    "t     Fire photon torpedo",
  645.    "f     Fire plasma torpedo",
  646. #ifdef SCAN
  647.    "a     Use scanning beam",
  648. #endif                /* ATM */
  649.    "d     detonate enemy torps",
  650.    "D     detonate own torps",
  651.    "L     List players",
  652.    "P     List planets",
  653.    "S     Status graph toggle",
  654.    "M     Turn on/off map window updating",
  655.    "]     Put up shields",
  656.    "[     Put down shields",
  657.    "u     Shield toggle",
  658.    "i     Info on player/planet",
  659.    "I     Extended info on player",
  660.    "b     Bomb planet",
  661.    "z     Beam up armies",
  662.    "x     Beam down armies",
  663.    "T     Toggle tractor beam",
  664.    "y     Toggle pressor beam",
  665.    "R     Enter repair mode",
  666.    "o     Orbit planet or dock to outpost",
  667.    "e     Docking permission toggle",
  668.    "r     Change vessels (ship type)",
  669.    "Q     Quit",
  670.    "?     Message window toggle",
  671.    "m     Warp to message window",
  672.    "c     Cloaking device toggle",
  673.    "C     Coup a planet",
  674.    "l     Lock on to player/planet",
  675.    "h     Help window toggle",
  676.    "w     War declarations window",
  677.    "N     Planet names toggle",
  678.    "V     Rotate local planet display",
  679.    "B     Rotate galactic planet display",
  680.    "E     Send distress call",
  681.    "*     Send in practice robot",
  682.    "U     Show rankings window",
  683.    "+     Show UDP options window",
  684.    "=     Update all",
  685.    "Space Remove info, planet, rank windows",
  686.    0,
  687. };
  688.  
  689. #define MAXHELP 40
  690.  
  691. fillhelp()
  692. {
  693.    register int    i = 0, row, column;
  694.  
  695.    W_ClearWindow(helpWin);
  696.    for (column = 0; column < 4; column++) {
  697.       for (row = 1; row < 12; row++) {
  698.      if (help_message[i] == 0)
  699.         break;
  700.      else {
  701.         W_WriteText(helpWin, MAXHELP * column, row, textColor,
  702.            help_message[i], strlen(help_message[i]), W_RegularFont);
  703.         i++;
  704.      }
  705.       }
  706.       if (help_message[i] == 0)
  707.      break;
  708.    }
  709. }
  710.  
  711. #endif                /* EM */
  712.  
  713. drawIcon()
  714. {
  715.    W_WriteBitmap(0, 0, icon, W_White);
  716. }
  717.  
  718. #define CLOCK_WID    (BOXSIDE * 9 / 10)
  719. #define CLOCK_HEI    (BOXSIDE * 2 / 3)
  720. #define CLOCK_BDR    0
  721. #define CLOCK_X        (BOXSIDE / 2 - CLOCK_WID / 2)
  722. #define CLOCK_Y        (BOXSIDE / 2 - CLOCK_HEI / 2)
  723.  
  724. #ifndef PI
  725. #define PI        3.141592654
  726. #endif
  727.  
  728. showTimeLeft(time, max)
  729.     int             time, max;
  730. {
  731.    char            buf[BUFSIZ], *cp;
  732.    int             cx, cy, ex, ey, tx, ty;
  733.  
  734.    if ((max - time) < 10 && time & 1) {
  735.       W_Beep();
  736.    }
  737.    /* XFIX */
  738.    W_ClearArea(qwin, CLOCK_X, CLOCK_Y, CLOCK_WID, CLOCK_HEI);
  739.  
  740.    cx = CLOCK_X + CLOCK_WID / 2;
  741.    cy = CLOCK_Y + (CLOCK_HEI - W_Textheight) / 2;
  742.    ex = cx - clock_width / 2;
  743.    ey = cy - clock_height / 2;
  744.    W_WriteBitmap(ex, ey, clockpic, foreColor);
  745.  
  746.    ex = cx - clock_width * sin(2 * PI * time / max) / 2;
  747.    ey = cy - clock_height * cos(2 * PI * time / max) / 2;
  748.    W_MakeLine(qwin, cx, cy, ex, ey, foreColor);
  749.  
  750.    sprintf(buf, "%d", max - time);
  751.    tx = cx - W_Textwidth * strlen(buf) / 2;
  752.    ty = cy - W_Textheight / 2;
  753.    W_WriteText(qwin, tx, ty, textColor, buf, strlen(buf), W_RegularFont);
  754.  
  755.    cp = "Auto Quit";
  756.    tx = CLOCK_X + cx - W_Textwidth * strlen(cp) / 2;
  757.    ty = CLOCK_Y + CLOCK_HEI - W_Textheight;
  758.    W_WriteText(qwin, tx, ty, textColor, cp, strlen(cp), W_RegularFont);
  759. }
  760.  
  761.  
  762. do_refit(type)
  763.     int             type;
  764. {
  765.    sendRefitReq(type);
  766.    localflags &= ~PFREFIT;
  767. }
  768.  
  769. #ifdef EM
  770. #define DEFAULT_SAVEFILE  "/tmp/netrek_motd"
  771. /* default file to save motd into */
  772.  
  773. /* save all the motd data into a save file! */
  774. SaveMotd()
  775. {
  776.    FILE           *fp;
  777.    struct list    *mtd_ptr = NULL;
  778.    char           *nameptr;
  779.    time_t          time_clock;
  780.  
  781.    if ((nameptr = getdefault("motd.savefile")) == NULL)
  782.       nameptr = DEFAULT_SAVEFILE;
  783. #ifdef SHOW_DEFAULTS
  784.    show_defaults("string", "motd.savefile", DEFAULT_SAVEFILE,
  785.       "Name of file to save motd in if 'S' typed in entry window.");
  786. #endif
  787.  
  788.    fp = fopen(nameptr, "a");
  789.  
  790.    if (fp == NULL) {
  791.       fprintf(stderr, "Couldn't open motd save file %s!\n", nameptr);
  792.       perror("fopen() error");
  793.       return;
  794.    }
  795.    time_clock = time(NULL);
  796.  
  797.    if (fprintf(fp, "Motd data captured at %s\n", ctime(&time_clock)) < 0) {
  798.       fprintf(stderr, "Error saving motd!\n");
  799.       perror("fprintf error");
  800.       fclose(fp);
  801.    }
  802.    for (mtd_ptr = motddata; mtd_ptr != NULL; mtd_ptr = mtd_ptr->next) {
  803.       if (fprintf(fp, "%s\n", mtd_ptr->data) < 0) {
  804.      fprintf(stderr, "Error writing motd!\n");
  805.      perror("fprintf error");
  806.      fclose(fp);
  807.       }
  808.    }
  809.    printf("Netrek motd saved in %s\n", nameptr);
  810.    fclose(fp);
  811. }
  812. #endif
  813.